{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "from keras.callbacks import ModelCheckpoint,EarlyStopping,ReduceLROnPlateau,TensorBoard\n",
    "from keras.models import Model\n",
    "from keras import backend as K\n",
    "from keras.optimizers import Adam\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import os\n",
    "from losses import bce_dice_loss\n",
    "from rssegnet import RSSegVGGNet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# # 从训练集取样本\n",
    "# samples_data_root = 'D:/Data/mc_data/train/images/0/'\n",
    "\n",
    "# filenames = np.random.choice(os.listdir(samples_data_root), 1000)\n",
    "# samples = []\n",
    "# for fn in filenames:\n",
    "#     fullname = samples_data_root + fn\n",
    "#     image = Image.open(fullname)\n",
    "#     image_arr = np.array(image)\n",
    "#     samples.append(image_arr)\n",
    "\n",
    "# sample_images = np.array(samples)\n",
    "# print(sample_images.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def adjust_data(img,mask):\n",
    "    mean_ = np.array([77.79408427,  89.68194542, 101.41694189])\n",
    "    img = (img - mean_) / 255\n",
    "    mask = mask /255\n",
    "    mask[mask > 0.5] = 1\n",
    "    mask[mask <= 0.5] = 0\n",
    "    return (img,mask)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_train_generator():\n",
    "    train_data_root = 'D:/Data/mc_data/train'  # 训练集存放路径\n",
    "\n",
    "    # data augmentation\n",
    "    # data_gen_args = dict(rotation_range=0.2,\n",
    "    #                     width_shift_range=0.05,\n",
    "    #                     height_shift_range=0.05,\n",
    "    #                     shear_range=0.05,\n",
    "    #                     zoom_range=0.05,\n",
    "    #                     horizontal_flip=True,\n",
    "    #                     fill_mode='nearest')\n",
    "    data_gen_args = dict()\n",
    "\n",
    "    train_image_datagen = ImageDataGenerator(**data_gen_args)\n",
    "    train_mask_datagen = ImageDataGenerator(**data_gen_args)\n",
    "\n",
    "    seed=1\n",
    "\n",
    "    train_image_generator = train_image_datagen.flow_from_directory(\n",
    "        train_data_root + '/images',\n",
    "        target_size=(288,288),\n",
    "        class_mode=None,\n",
    "        batch_size=16,\n",
    "        seed=seed,\n",
    "        color_mode='rgb')\n",
    "\n",
    "    train_mask_generator = train_mask_datagen.flow_from_directory(\n",
    "        train_data_root + '/masks',\n",
    "        target_size=(288,288),\n",
    "        class_mode=None,\n",
    "        batch_size=16,\n",
    "        seed=seed,\n",
    "        color_mode='grayscale')\n",
    "\n",
    "    # combine generators into one which yields image and masks\n",
    "    train_generator = zip(train_image_generator, train_mask_generator)\n",
    "    \n",
    "    for (image, mask) in train_generator:\n",
    "#         print(image.shape)\n",
    "#         print(mask.shape)\n",
    "        yield adjust_data(image, mask)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_val_generator():\n",
    "    val_data_root = 'D:/Data/mc_data/val'  # 验证集存放路径\n",
    "    \n",
    "    # data augmentation\n",
    "    # data_gen_args = dict(rotation_range=0.2,\n",
    "    #                     width_shift_range=0.05,\n",
    "    #                     height_shift_range=0.05,\n",
    "    #                     shear_range=0.05,\n",
    "    #                     zoom_range=0.05,\n",
    "    #                     horizontal_flip=True,\n",
    "    #                     fill_mode='nearest')\n",
    "    data_gen_args = dict()\n",
    "\n",
    "    val_image_datagen = ImageDataGenerator(**data_gen_args)\n",
    "    val_mask_datagen = ImageDataGenerator(**data_gen_args)\n",
    "\n",
    "    seed = 1\n",
    "\n",
    "    val_image_generator = val_image_datagen.flow_from_directory(\n",
    "        val_data_root + '/images',\n",
    "        target_size=(288,288),\n",
    "        class_mode=None,\n",
    "        batch_size=16,\n",
    "        seed=seed,\n",
    "        color_mode='rgb')\n",
    "\n",
    "    val_mask_generator = val_mask_datagen.flow_from_directory(\n",
    "        val_data_root + '/masks',\n",
    "        target_size=(288,288),\n",
    "        class_mode=None,\n",
    "        batch_size=16,\n",
    "        seed=seed,\n",
    "        color_mode='grayscale')\n",
    "\n",
    "    val_generator = zip(val_image_generator, val_mask_generator)\n",
    "    \n",
    "    for (image, mask) in val_generator:\n",
    "#         print(image.shape)\n",
    "#         print(mask.shape)\n",
    "        yield adjust_data(image, mask)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "image_input (InputLayer)        (None, 288, 288, 3)  0                                            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_1 (Conv2D)               (None, 288, 288, 64) 1792        image_input[0][0]                \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_2 (Conv2D)               (None, 288, 288, 64) 36928       conv2d_1[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2D)  (None, 144, 144, 64) 0           conv2d_2[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_3 (Conv2D)               (None, 144, 144, 128 73856       max_pooling2d_1[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_4 (Conv2D)               (None, 144, 144, 128 147584      conv2d_3[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2D)  (None, 72, 72, 128)  0           conv2d_4[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_5 (Conv2D)               (None, 72, 72, 256)  295168      max_pooling2d_2[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_6 (Conv2D)               (None, 72, 72, 256)  590080      conv2d_5[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_7 (Conv2D)               (None, 72, 72, 256)  590080      conv2d_6[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_3 (MaxPooling2D)  (None, 36, 36, 256)  0           conv2d_7[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_8 (Conv2D)               (None, 36, 36, 512)  1180160     max_pooling2d_3[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_9 (Conv2D)               (None, 36, 36, 512)  2359808     conv2d_8[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_10 (Conv2D)              (None, 36, 36, 512)  2359808     conv2d_9[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_4 (MaxPooling2D)  (None, 18, 18, 512)  0           conv2d_10[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_11 (Conv2D)              (None, 18, 18, 512)  2359808     max_pooling2d_4[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_12 (Conv2D)              (None, 18, 18, 512)  2359808     conv2d_11[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_13 (Conv2D)              (None, 18, 18, 512)  2359808     conv2d_12[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_5 (MaxPooling2D)  (None, 9, 9, 512)    0           conv2d_13[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_14 (Conv2D)              (None, 9, 9, 512)    2359808     max_pooling2d_5[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_1 (Conv2DTrans (None, 18, 18, 256)  1179904     conv2d_14[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_1 (Concatenate)     (None, 18, 18, 768)  0           conv2d_transpose_1[0][0]         \n",
      "                                                                 conv2d_13[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_15 (Conv2D)              (None, 18, 18, 512)  3539456     concatenate_1[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_2 (Conv2DTrans (None, 36, 36, 256)  1179904     conv2d_15[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_2 (Concatenate)     (None, 36, 36, 768)  0           conv2d_transpose_2[0][0]         \n",
      "                                                                 conv2d_10[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_16 (Conv2D)              (None, 36, 36, 512)  3539456     concatenate_2[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_3 (Conv2DTrans (None, 72, 72, 128)  589952      conv2d_16[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_3 (Concatenate)     (None, 72, 72, 384)  0           conv2d_transpose_3[0][0]         \n",
      "                                                                 conv2d_7[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_17 (Conv2D)              (None, 72, 72, 256)  884992      concatenate_3[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_4 (Conv2DTrans (None, 144, 144, 64) 147520      conv2d_17[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_4 (Concatenate)     (None, 144, 144, 192 0           conv2d_transpose_4[0][0]         \n",
      "                                                                 conv2d_4[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_18 (Conv2D)              (None, 144, 144, 128 221312      concatenate_4[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_transpose_5 (Conv2DTrans (None, 288, 288, 32) 36896       conv2d_18[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_5 (Concatenate)     (None, 288, 288, 96) 0           conv2d_transpose_5[0][0]         \n",
      "                                                                 conv2d_2[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_19 (Conv2D)              (None, 288, 288, 1)  865         concatenate_5[0][0]              \n",
      "==================================================================================================\n",
      "Total params: 28,394,753\n",
      "Trainable params: 28,394,753\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = RSSegVGGNet.build()\n",
    "model.compile(loss=bce_dice_loss, optimizer=Adam(), metrics=['accuracy'])\n",
    "model.summary()\n",
    "# model.load_weights(\"building_seg_vgg16_bcedice_0829.h5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/300\n",
      "Found 220453 images belonging to 1 classes.\n",
      "Found 220453 images belonging to 1 classes.\n",
      "11999/12000 [============================>.] - ETA: 0s - loss: 0.3787 - acc: 0.9297Found 60317 images belonging to 1 classes.\n",
      "Found 60317 images belonging to 1 classes.\n",
      "12000/12000 [==============================] - 7839s 653ms/step - loss: 0.3787 - acc: 0.9297 - val_loss: 0.2647 - val_acc: 0.9511\n",
      "Epoch 2/300\n",
      "12000/12000 [==============================] - 7186s 599ms/step - loss: 0.2360 - acc: 0.9577 - val_loss: 0.2297 - val_acc: 0.9594\n",
      "Epoch 3/300\n",
      "12000/12000 [==============================] - 7065s 589ms/step - loss: 0.2120 - acc: 0.9620 - val_loss: 0.2011 - val_acc: 0.9639\n",
      "Epoch 4/300\n",
      "12000/12000 [==============================] - 7070s 589ms/step - loss: 0.1977 - acc: 0.9645 - val_loss: 0.2042 - val_acc: 0.9629\n",
      "Epoch 5/300\n",
      "12000/12000 [==============================] - 7083s 590ms/step - loss: 0.1879 - acc: 0.9662 - val_loss: 0.1823 - val_acc: 0.9674\n",
      "Epoch 6/300\n",
      "12000/12000 [==============================] - 7079s 590ms/step - loss: 0.1798 - acc: 0.9676 - val_loss: 0.1869 - val_acc: 0.9665\n",
      "Epoch 7/300\n",
      "12000/12000 [==============================] - 7065s 589ms/step - loss: 0.1726 - acc: 0.9688 - val_loss: 0.1765 - val_acc: 0.9679\n",
      "Epoch 8/300\n",
      "12000/12000 [==============================] - 7063s 589ms/step - loss: 0.1668 - acc: 0.9698 - val_loss: 0.1734 - val_acc: 0.9687\n",
      "Epoch 9/300\n",
      "12000/12000 [==============================] - 7064s 589ms/step - loss: 0.1601 - acc: 0.9709 - val_loss: 0.1698 - val_acc: 0.9697\n",
      "Epoch 10/300\n",
      "12000/12000 [==============================] - 7066s 589ms/step - loss: 0.1547 - acc: 0.9719 - val_loss: 0.1800 - val_acc: 0.9668\n",
      "Epoch 11/300\n",
      "12000/12000 [==============================] - 7067s 589ms/step - loss: 0.1503 - acc: 0.9727 - val_loss: 0.1647 - val_acc: 0.9700\n",
      "Epoch 12/300\n",
      "12000/12000 [==============================] - 7066s 589ms/step - loss: 0.1462 - acc: 0.9733 - val_loss: 0.1531 - val_acc: 0.9719\n",
      "Epoch 13/300\n",
      "12000/12000 [==============================] - 7059s 588ms/step - loss: 0.1422 - acc: 0.9740 - val_loss: 0.1503 - val_acc: 0.9730\n",
      "Epoch 14/300\n",
      "12000/12000 [==============================] - 7066s 589ms/step - loss: 0.1387 - acc: 0.9746 - val_loss: 0.1439 - val_acc: 0.9738\n",
      "Epoch 15/300\n",
      "12000/12000 [==============================] - 7068s 589ms/step - loss: 0.1359 - acc: 0.9751 - val_loss: 0.1463 - val_acc: 0.9736\n",
      "Epoch 16/300\n",
      "12000/12000 [==============================] - 7069s 589ms/step - loss: 0.1330 - acc: 0.9756 - val_loss: 0.1413 - val_acc: 0.9742\n",
      "Epoch 17/300\n",
      "12000/12000 [==============================] - 7096s 591ms/step - loss: 0.1302 - acc: 0.9761 - val_loss: 0.1460 - val_acc: 0.9734\n",
      "Epoch 18/300\n",
      "12000/12000 [==============================] - 7085s 590ms/step - loss: 0.1287 - acc: 0.9764 - val_loss: 0.1510 - val_acc: 0.9734\n",
      "Epoch 19/300\n",
      "12000/12000 [==============================] - 7079s 590ms/step - loss: 0.1270 - acc: 0.9767 - val_loss: 0.1334 - val_acc: 0.9761\n",
      "Epoch 20/300\n",
      "12000/12000 [==============================] - 7064s 589ms/step - loss: 0.1268 - acc: 0.9767 - val_loss: 0.1374 - val_acc: 0.9755\n",
      "Epoch 21/300\n",
      "12000/12000 [==============================] - 7068s 589ms/step - loss: 0.1268 - acc: 0.9767 - val_loss: 0.1390 - val_acc: 0.9748\n",
      "Epoch 22/300\n",
      "12000/12000 [==============================] - 7066s 589ms/step - loss: 0.1278 - acc: 0.9765 - val_loss: 0.1403 - val_acc: 0.9743\n",
      "Epoch 23/300\n",
      "12000/12000 [==============================] - 7058s 588ms/step - loss: 0.1146 - acc: 0.9789 - val_loss: 0.1286 - val_acc: 0.9772\n",
      "Epoch 24/300\n",
      "12000/12000 [==============================] - 7066s 589ms/step - loss: 0.1078 - acc: 0.9802 - val_loss: 0.1250 - val_acc: 0.9775\n",
      "Epoch 25/300\n",
      "12000/12000 [==============================] - 7070s 589ms/step - loss: 0.1043 - acc: 0.9808 - val_loss: 0.1171 - val_acc: 0.9790\n",
      "Epoch 26/300\n",
      "12000/12000 [==============================] - 7075s 590ms/step - loss: 0.1015 - acc: 0.9814 - val_loss: 0.1202 - val_acc: 0.9786\n",
      "Epoch 27/300\n",
      "12000/12000 [==============================] - 7068s 589ms/step - loss: 0.0991 - acc: 0.9818 - val_loss: 0.1214 - val_acc: 0.9784\n",
      "Epoch 28/300\n",
      "12000/12000 [==============================] - 7075s 590ms/step - loss: 0.0974 - acc: 0.9822 - val_loss: 0.1127 - val_acc: 0.9801\n",
      "Epoch 29/300\n",
      "12000/12000 [==============================] - 7088s 591ms/step - loss: 0.0957 - acc: 0.9825 - val_loss: 0.1150 - val_acc: 0.9798\n",
      "Epoch 30/300\n",
      "12000/12000 [==============================] - 7043s 587ms/step - loss: 0.0939 - acc: 0.9828 - val_loss: 0.1107 - val_acc: 0.9801\n",
      "Epoch 31/300\n",
      "12000/12000 [==============================] - 7072s 589ms/step - loss: 0.0925 - acc: 0.9831 - val_loss: 0.1113 - val_acc: 0.9800\n",
      "Epoch 32/300\n",
      "12000/12000 [==============================] - 7073s 589ms/step - loss: 0.0909 - acc: 0.9834 - val_loss: 0.1073 - val_acc: 0.9806\n",
      "Epoch 33/300\n",
      "12000/12000 [==============================] - 7073s 589ms/step - loss: 0.0895 - acc: 0.9837 - val_loss: 0.1161 - val_acc: 0.9800\n",
      "Epoch 34/300\n",
      "12000/12000 [==============================] - 7069s 589ms/step - loss: 0.0883 - acc: 0.9839 - val_loss: 0.1118 - val_acc: 0.9803\n",
      "Epoch 35/300\n",
      "12000/12000 [==============================] - 7071s 589ms/step - loss: 0.0869 - acc: 0.9842 - val_loss: 0.1049 - val_acc: 0.9812\n",
      "Epoch 36/300\n",
      "12000/12000 [==============================] - 7073s 589ms/step - loss: 0.0858 - acc: 0.9844 - val_loss: 0.1046 - val_acc: 0.9816\n",
      "Epoch 37/300\n",
      "12000/12000 [==============================] - 7070s 589ms/step - loss: 0.0845 - acc: 0.9847 - val_loss: 0.1116 - val_acc: 0.9811\n",
      "Epoch 38/300\n",
      "12000/12000 [==============================] - 7070s 589ms/step - loss: 0.0837 - acc: 0.9848 - val_loss: 0.1092 - val_acc: 0.9809\n",
      "Epoch 39/300\n",
      "12000/12000 [==============================] - 7071s 589ms/step - loss: 0.0826 - acc: 0.9850 - val_loss: 0.1019 - val_acc: 0.9820\n",
      "Epoch 40/300\n",
      "12000/12000 [==============================] - 7086s 591ms/step - loss: 0.0815 - acc: 0.9853 - val_loss: 0.1029 - val_acc: 0.9819\n",
      "Epoch 41/300\n",
      "12000/12000 [==============================] - 7091s 591ms/step - loss: 0.0806 - acc: 0.9854 - val_loss: 0.1037 - val_acc: 0.9817\n",
      "Epoch 42/300\n",
      "12000/12000 [==============================] - 7069s 589ms/step - loss: 0.0796 - acc: 0.9856 - val_loss: 0.0995 - val_acc: 0.9826\n",
      "Epoch 43/300\n",
      "12000/12000 [==============================] - 7061s 588ms/step - loss: 0.0786 - acc: 0.9858 - val_loss: 0.1042 - val_acc: 0.9822\n",
      "Epoch 44/300\n",
      "12000/12000 [==============================] - 7061s 588ms/step - loss: 0.0779 - acc: 0.9860 - val_loss: 0.0999 - val_acc: 0.9828\n",
      "Epoch 45/300\n",
      "12000/12000 [==============================] - 7063s 589ms/step - loss: 0.0770 - acc: 0.9861 - val_loss: 0.1035 - val_acc: 0.9826\n",
      "Epoch 46/300\n",
      "12000/12000 [==============================] - 7070s 589ms/step - loss: 0.0753 - acc: 0.9865 - val_loss: 0.0996 - val_acc: 0.9828\n",
      "Epoch 47/300\n",
      "12000/12000 [==============================] - 7072s 589ms/step - loss: 0.0744 - acc: 0.9867 - val_loss: 0.1037 - val_acc: 0.9824\n",
      "Epoch 48/300\n",
      "12000/12000 [==============================] - 7071s 589ms/step - loss: 0.0740 - acc: 0.9868 - val_loss: 0.0963 - val_acc: 0.9832\n",
      "Epoch 49/300\n",
      "12000/12000 [==============================] - 7070s 589ms/step - loss: 0.0737 - acc: 0.9868 - val_loss: 0.1017 - val_acc: 0.9827\n",
      "Epoch 50/300\n",
      "12000/12000 [==============================] - 7081s 590ms/step - loss: 0.0734 - acc: 0.9869 - val_loss: 0.0987 - val_acc: 0.9826\n",
      "Epoch 51/300\n",
      "12000/12000 [==============================] - 7091s 591ms/step - loss: 0.0733 - acc: 0.9869 - val_loss: 0.1009 - val_acc: 0.9829\n",
      "Epoch 52/300\n",
      "12000/12000 [==============================] - 7089s 591ms/step - loss: 0.0731 - acc: 0.9870 - val_loss: 0.1008 - val_acc: 0.9831\n",
      "Epoch 53/300\n",
      "12000/12000 [==============================] - 7094s 591ms/step - loss: 0.0730 - acc: 0.9870 - val_loss: 0.1020 - val_acc: 0.9823\n",
      "Epoch 54/300\n",
      "12000/12000 [==============================] - 7089s 591ms/step - loss: 0.0729 - acc: 0.9870 - val_loss: 0.1010 - val_acc: 0.9825\n",
      "Epoch 55/300\n",
      "12000/12000 [==============================] - 7070s 589ms/step - loss: 0.0729 - acc: 0.9870 - val_loss: 0.1015 - val_acc: 0.9827\n",
      "Epoch 56/300\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "12000/12000 [==============================] - 7057s 588ms/step - loss: 0.0728 - acc: 0.9870 - val_loss: 0.0984 - val_acc: 0.9831\n",
      "Epoch 57/300\n",
      "12000/12000 [==============================] - 7063s 589ms/step - loss: 0.0729 - acc: 0.9870 - val_loss: 0.0935 - val_acc: 0.9839\n",
      "Epoch 58/300\n",
      "12000/12000 [==============================] - 7068s 589ms/step - loss: 0.0729 - acc: 0.9870 - val_loss: 0.0999 - val_acc: 0.9830\n",
      "Epoch 59/300\n",
      "12000/12000 [==============================] - 7083s 590ms/step - loss: 0.0726 - acc: 0.9871 - val_loss: 0.0985 - val_acc: 0.9831\n",
      "Epoch 60/300\n",
      "12000/12000 [==============================] - 7074s 590ms/step - loss: 0.0730 - acc: 0.9870 - val_loss: 0.1021 - val_acc: 0.9825\n",
      "Epoch 61/300\n",
      "12000/12000 [==============================] - 7071s 589ms/step - loss: 0.0730 - acc: 0.9870 - val_loss: 0.0963 - val_acc: 0.9836\n",
      "Epoch 62/300\n",
      "12000/12000 [==============================] - 7069s 589ms/step - loss: 0.0728 - acc: 0.9870 - val_loss: 0.1019 - val_acc: 0.9831\n",
      "Epoch 63/300\n",
      "12000/12000 [==============================] - 7063s 589ms/step - loss: 0.0727 - acc: 0.9870 - val_loss: 0.0977 - val_acc: 0.9832\n",
      "Epoch 64/300\n",
      "12000/12000 [==============================] - 7086s 590ms/step - loss: 0.0730 - acc: 0.9870 - val_loss: 0.1024 - val_acc: 0.9824\n"
     ]
    }
   ],
   "source": [
    "callback_list = [\n",
    "    EarlyStopping(\n",
    "        monitor='acc',\n",
    "        patience=5,\n",
    "    ),\n",
    "    ModelCheckpoint(\n",
    "        filepath='building_seg_vgg16_bcedice_0829.h5',\n",
    "        monitor='val_loss',\n",
    "        save_best_only=True,\n",
    "    ),\n",
    "    ReduceLROnPlateau(\n",
    "        monitor='val_loss',\n",
    "        factor=0.1,\n",
    "        patience=3,\n",
    "    ),\n",
    "    TensorBoard(\n",
    "        log_dir = 'logs'\n",
    "    ),\n",
    "]\n",
    "\n",
    "history = model.fit_generator(make_train_generator(),\n",
    "                              epochs=300,\n",
    "                              steps_per_epoch=12000,\n",
    "                              validation_data=make_val_generator(),\n",
    "                              validation_steps=50,\n",
    "                              callbacks=callback_list,\n",
    "                              verbose=1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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b9oEN91UPClv2gRPP10yKefmlv164cqEm5coCR/ce18pgvwcqMopGs074X4mRsvDDz+sjz32WIn5+fn5euzYsei9UJyy5p34E6QJRaT0Zguboj+lpZXvcyRg805cnMgtj8xMGDPG1TpU3d8xYyrnxMi6detIT0/n1ltvpVevXmzfvp0xY8aQkZFBly5dmDhxYmHZfv36sWzZMvLy8mjSpAnjxo2je/fu9O3bl127dgHw4IMP8sQTTxSWHzduHH369KFjx4785z/uhkEHDhxg+PDhdO/enZEjR5KRkcGyZctKxPbwww9z1llnFcbnvhOwZs0aBg4cSPfu3enVqxcbvd+Pjz76KF27dqV79+6MHz8++m+WiYmyTho2bw4//GHx/5enny7ePAPVq4Yd2p8jORlCf2yHmxcq6HrHM6+ir9mgQVHzWdQFOTJU5XS8Nf20tOgcNSPx1/TXrl2rIqKffvpp4fLdu3erqmpubq7269dPV6xYoaqq5557ri5dulRzc3MV0Ndff11VVe+66y6dPHmyqqqOHz9ep06dWlj+vvvuU1XVV199VS+55BJVVZ08ebLefvvtqqq6bNkyrVWrli5durREnAVx5Ofn64gRIwpfr1evXjpv3jxVVT106JAeOHBA582bp/369dODBw8WW7cirKZfNaJ50jPaU+ivgmif4Dyek8AVWe945h3Pa5YXAWv6MU/yodPxJv1IP0NFAm+iVKFJ//TTTy+2/KmnntKePXtq165dNSUlRV944QVVLZ7069evX1h+1qxZesstt6hqyaT/8ccfq6pqdna2duzYUVVVL7vsMn3vvfcK1+/atWvYpD9nzhw966yztGvXrtqqVSt97LHHdM+ePdq2bdsSZe+44w6dMWNGhd8TP0v60VfRZB7tJpkgyTxoUq7KZJgogib9Gncit21b9xM13PzK0LBhw8LHa9eu5cknn+TTTz+lSZMmXH/99WH7rftP/CYlJZGXF35kirp165Yo4z7b0h08eJCxY8fy2Wef0bp1ax588MHCOMJd66Cqdg1ENRHkBGrQk6UBvioRhfaSadAAbrwRXn+99N47kyZBpH4IQfonhCtj/Rqiq8a16U+a5L6gfpXaPubz3Xff0ahRIxo3bsz27dt58803o/4a/fr1Y86cOQB88cUXrFxZ4vYEHDp0iFq1atG8eXP27dvHSy+9BEDTpk1p3rw5r732GuAuejt48CAXX3wxf/nLXzh06BAAe/bsiXrcJn7a1xs0gFtvdV0GRdzf6dPhD39wXQjz893fUaPcFDrPVG81rqZf8KULWvuIpl69etG5c2fS09M59dRTOffcc6P+Gj/96U/5wQ9+QLdu3ejVqxfp6emceOKJxcqkpKRw4403kp6eTlpaGmefXXTPm8zMTG655RbGjx9PnTp1eOmll7j88stZvnw5GRkZJCcnM2TIEP7v//4v6rEnkop0edy9u+R2jjfBh9bYI/WHb9wY9uyp2v8XEyNB2oCqcrIrckuXm5urhw4dUlXVNWvWaLt27TQ3NzfGURVJxM8qFl0eo9m+bu3kNQOJ2qZf0+3fv58LLriAvLw8VJU//elP1K5tH2NVqWibezy2r5uaybJFnGnSpAlLliyJdRgJIRYJPlSkBG/JPDqOHIGpU+Hzz+E3v4HU1FhHVPks6Rvj8Sf5Zs1g376yhxgoT4K39vXqZf58uOMOWLfOve/z57vP+NprK77NPXtgxgzo0gUGDgSvA161UuN67xgTRLghcP1Xcu/eXXKAsPImeL9wPWL++leXIELnff11fPeGUYVPP4Vt28ouGwvr18MVV7hfbklJ8OabsHIldOwII0bA9dfDt9+Wf7srVkCfPnDvvW7bLVvCddfBCy+47e3Z4yoUK1e692f9+ujvWyBBGv6rcrITufGtOn5WlX2iNXTdSCdQE8GKFaoXXODeh6Qk1eHDVRcsUM3PD76N3btVP/hA9ZlnVO++W3XwYNUbb1Rdu7ZiMeXnq65Zo/rUU6pDh6rWravasKHqb36jeuRIUbncXNVf/tLF3aaN6qOPqt51l+r3v6/at6/7HIcMUf3ww5Kv8corqiecoHryyaqLFqn+61+qP/qRavPmkb83tWqpjh2r+s03FduvUNjQyiYWYv1ZldUOD8c3PG/Qk6rVqYZ++LBrvkhKCr98yxb47W/htdfg5JPh1FOLpkaNXI107dqiqX59uOwyGDIE+vVz2967FyZMgN//3q3z4IOwY4f7JbNnj6tF//jHcOaZ0KQJNG3q/taqBcuXQ1ZW0bRlS1Fs9erBGWe4183Nddt46CEXZ6R93bDBNdmsW+dq3wsWFA1R3L69i33cOGjdOvw2PvkEbrjBvWaDBtCmjWvrb9kS3n7b/RI7/3x44AG46CL3eT/0EJx1FsydW3y7eXnw4Yfw8cduX044wU0NG8Ibb7hrH1q2dO//yJElfyGWR9ChlWNesw+dqmNNv3///vrGG28Umzd16lS97bbbSl2vYcOGqqq6detWHT58eMRtL168uNTtTJ06VQ8cOFD4fPDgwfpNtKoHUVaVn1VVd5WMtxr80aOqv/qVar16qi1aqI4erfryy6r79rnlX36p+oMfqNau7abLLlPt39/VckPft2bNVM8+W3XUKNVBg4q6hzZponr11aotW7p1xoxR3bWrKIaDB1VnzlQ955yy398OHVRHjnQ18H/+U/Wrr1Tz8tx2tm1z733t2u5zeOAB1VdfVZ0yRfWWW1QHDlRt27Zk3E2bql5xheq0aeX7pZCX52rgob9Q9u9XfeIJ1dRUt/2TT3Z/b7hB1etJXS5ZWaoZGW4bAweqrlpV/m0UIFHH3qkMTz/9tI4ePbrYvLPPPrvYGDjhFCT90gRJ+mlpaZqTk1N2oNVAVX1Ws2ZFP8GH6/uekhIfCT7U4sWq3bu7/Rg6VPW661yCBte80atX0YHszjtVN20qvv7hw6qrV7vthBt/b98+dwAZPdolvvPOcwmsNBs2qH78ser8+ap//7vqH/7gEug776h++22w/Vq7VnXEiMgHpAkT3Of08ceqX39dvmal8jhyRHXGDNU+fVR/+9vje528PPdenHii6plnqlZ0hHZL+lH09ddfa/PmzfXw4cOqqrphwwZt06aN5ufn6759+3TgwIHas2dPTU9P11deeaVwvYKkv2HDBu3SpYuqqh48eFCvvfZa7dq1q15zzTXap0+fwqR/6623au/evbVz58760EMPqarqk08+qcnJyZqenq4DBgxQ1eIHgccff1y7dOmiXbp0KRysbcOGDdqpUye9+eabtXPnznrRRRcVjqDpN2/ePO3Tp4/26NFDL7jgAt2xY4eqqu7bt09Hjx6t6enp2rVrV33xxRdVVXX+/Pnas2dP7datmw4cODDse1VZn1VorT4lJboJvjrX4o8cUb33XtXWrVU7dnS15kGDXPK74w5X250zxyW6DRtcO3StWqqnnOISc4GjR12CvesulyQnTHCJMR6tWqX6ySfhD0jxascO1SVLKr5+jU36d97pfoJGc7rzzrLf0EsvvbQwoU+ePFnvueceVXVXyO7du1dVVXNycvS0007TfO+wHy7pP/7443rTTTep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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "acc = history.history['acc']\n",
    "val_acc = history.history['val_acc']\n",
    "loss = history.history['loss']\n",
    "val_loss = history.history['val_loss']\n",
    "epochs = range(1, len(acc) + 1)\n",
    "plt.plot(epochs, acc, 'bo', label='Training acc')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "plt.title('Training and validation accuracy')\n",
    "plt.legend()\n",
    "plt.figure()\n",
    "plt.plot(epochs, loss, 'bo', label='Training loss')\n",
    "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
    "plt.title('Training and validation loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
